/*****************************************************************************
* File Name: battery.c
*
* Version: 1.0
*
* Description:
* This file contains functions for reading the current battery voltage
*
* Note:
* Defining DISABLE_BATTERY in platform.h to disable battery module
*
* Owner: MRAO
*
* Related Document:
* ADC_SAR_Seq component datasheet
*
* Hardware Dependency:
* Battery Monitoring Circuit
*
* Code Tested With:
* 1. PSoC Creator 3.1 
* 2. ARM GCC 4.8.4
******************************************************************************
* Copyright (2015), Cypress Semiconductor Corporation.
******************************************************************************
* This software is owned by Cypress Semiconductor Corporation (Cypress) and is
* protected by and subject to worldwide patent protection (United States and
* foreign), United States copyright laws and international treaty provisions.
* Cypress hereby grants to licensee a personal, non-exclusive, non-transferable
* license to copy, use, modify, create derivative works of, and compile the
* Cypress Source Code and derivative works for the sole purpose of creating
* custom software in support of licensee product to be used only in conjunction
* with a Cypress integrated circuit as specified in the applicable agreement.
* Any reproduction, modification, translation, compilation, or representation of
* this software except as specified above is prohibited without the express
* written permission of Cypress.
*
* Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH
* REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 
* Cypress reserves the right to make changes without further notice to the
* materials described herein. Cypress does not assume any liability arising out
* of the application or use of any product or circuit described herein. Cypress
* does not authorize its products for use as critical components in life-support
* systems where a malfunction or failure may reasonably be expected to result in
* significant injury to the user. The inclusion of Cypress' product in a life-
* support systems application implies that the manufacturer assumes all risk of
* such use and in doing so indemnifies Cypress against all charges. Use may be
* limited by and subject to the applicable Cypress software license agreement.
*****************************************************************************/
#include "battery.h"
#include "debug.h"

#ifndef DISABLE_BATTERY

/*****************************************************************************
* Function Name: Battery_Init()
******************************************************************************
* Summary:
* This function is used  initialize the battery module
*
* Parameters:
* None
*
* Return:
* None
*
* Theory:
* Initialize the ADC component
*
* Side Effects:
* None
* 
* Note:
* None
*****************************************************************************/    
void Battery_Init(void)
{
    /*Start the ADC module*/
    ADC_Start();    
}

/*****************************************************************************
* Function Name: Battery_Get_Value()
******************************************************************************
* Summary:
* This function gets the current battery voltage value
*
* Parameters:
* None
*
* Return:
* uint16 - Current battery voltage as read by ADC component
*
* Theory:
* Enables the battery monitoring circuit and starts the ADC to sample the 
* battery voltage
*
* Side Effects:
* None
* 
* Note:
* None
*****************************************************************************/
uint16 Battery_Get_Value(void)
{
    int16 batteryData;
    ADC_Wakeup();
    Battery_Enable();
    /* Start ADC conversion */
    ADC_StartConvert();
    ADC_IsEndConversion(ADC_WAIT_FOR_RESULT);
    /* Get current battery voltage by reading the ADC Value */
    batteryData = ADC_GetResult16(0);
    ADC_StopConvert();
    Battery_Disable();
    ADC_Sleep();
    return batteryData; 
}

/*****************************************************************************
* Function Name: Battery_Stop()
******************************************************************************
* Summary:
* This function is used to stop the battery module
*
* Parameters:
* None
*
* Return:
* None
*
* Theory:
* Stops the ADC component
*
* Side Effects:
* None
* 
* Note:
* None
*****************************************************************************/
void Battery_Stop(void)
{
    ADC_Stop();
}

#ifdef ENABLE_HARDWARE_WORKAROUND_MINIPROG
/*****************************************************************************
* Function Name: Battery_No_Battery_Connected()
******************************************************************************
* Summary:
* This function is used to change drive mode of the BatteryEn_Voice_Button Pin
* 
* Parameters:
* bool isRevertMode - true to change the drive mode of BatteryEn_Voice_Button to 
*                     Open Drain and false to change it to Pull Up
*
* Return:
* None
*
* Theory:
* Updates the BatteryEn_Voice_Button pin depending upon the isRevertMode
*
* Side Effects:
* None
* 
* Note:
* None
*****************************************************************************/
void Battery_No_Battery_Connected(bool isRevertMode)
{
    if(!isRevertMode)
    {
        ADC_Pin_SetDriveMode(ADC_Pin_DM_RES_UP);
        ADC_Pin_Write(LOGIC_LOW);
        BatteryEn_Voice_Button_SetDriveMode(BatteryEn_Voice_Button_DM_RES_UP);
    }
    else
    {
        BatteryEn_Voice_Button_SetDriveMode(BatteryEn_Voice_Button_DM_OD_LO);
        ADC_Pin_SetDriveMode(ADC_Pin_DM_ALG_HIZ);
        BatteryEn_Voice_Button_Write(LOGIC_LOW);
    }
}

#endif /* ENABLE_HARDWARE_WORKAROUND_MINIPROG */

#endif /* DISABLE_BATTERY */
